/**
 * @Author:       lee
 * @Email:        liwei@hiynn.com
 * @DateTime:     2017-11-06 21:26:38
 * @Description:  set与map集合
 */
/**
 *  ES5中的set与map
 *  一般来说，Set集合常被用于检查对象中是否存在某个键名
 *          而Map集合常被用于获取已存的信息
 */
var set = Object.create(null)
set.foo = 'testSet'
if(set.foo) {
  console.log('属性存在')
}

var map = Object.create(null)
map.foo = 'testMap';
var value = map.foo;
console.log('map的foo属性是：' + value)
//上述方法存在的问题：内部的自动转换机制
var map = Object.create(null)
map[5] = 'foo';
console.log(map[5])//foo
console.log(map['5'])//foo

//-------------------------------------------------------------
/**
 *  Set集合:
 *  add()方法添加元素
 *  size属性获取元素数量
 *  不会对所存值进行强制的类型转换
 */

let set = new Set()
set.add('5')
set.add(5)
set.add(5)//重复，本次直接被忽略
console.log(set.size)//2
/**
 *  Set构造函数会过滤掉重复的值而保证集合中各元素各自唯一
 *  has()方法检测集合中是否存在某个值
 *  delete()移除某一个元素
 *  clear()移除所有元素
 *  forEach()  遍历
 */
let set = new Set([1,1,2,2,3,3,4,4])
console.log(set.size)//4
console.log(set.has(1))//true

let set = new Set([1,2,3])
set.forEach(function(value,key,ownerSet) {
  console.log(key + ' ' + value)
  console.log(ownerSet === set)
})


let set = new Set([11,22,33,44])
let processor = {
  output(value) {
    console.log(value)
  },
  process(dataset) {
    dataset.forEach(value => {
      this.output(value)
    })
  }
}
processor.process(set)
//----------------------------------------------------------------------
/**
 *  Set转数组
 *  创建一个无重复元素的新数组
 */
let set = new Set([1,2,3,1,2,4,5,6]);
let array = [...set]
console.log(array)//[1,2,3,4,5,6]

function uniqueArr(arr) {
  return [...new Set(arr)]
}

let arr = [10,10,20,20,30,30,40];
console.log(uniqueArr(arr))//[10, 20, 30, 40]
//----------------------------------------------------------------------
/**
 *  map集合
 *  set(key:value)
 *  get(key)
 */
let map = new Map();
map.set('name','funlee')
map.set('job','js')

console.log(map.get('name'))
console.log(map.get('job'))

let obj = {}
map.set(obj,5)
console.log(map.get(obj))
/**
 *  Map 初始化
 */
let map = new Map([['name','funlee'],['age',25]]);
// let map = new Map(['name','funlee'],['age',25]);//错误写法
console.log(map.has('name'));
console.log(map.get('age'));

map.forEach(function(value,key,ownerMap) {
  console.log(value + ':' + key)
})

